import matplotlib as mlp
import numpy as np
import streamlit as st
from PIL import Image
from figure import MyFigure
from my_data import JobData

if __name__ == '__main__':
    mlp.rcParams['font.sans-serif'] = ['SimHei']
    mlp.rcParams['axes.unicode_minus'] = False
    st.set_page_config(page_title="demo - MyDataAnalysis")

    st.sidebar.title("导航栏")
    user_option = st.sidebar.selectbox('请选择想要跳转的页面', ('欢迎', '分析报告'))

    if user_option == '欢迎':
        st.image(np.array(Image.open(r"D:\PycharmProjects\51jobProject\Teacher\gui\images\welcome_pic.png")))
        st.title("Welcome to my data analysis！")
        st.markdown("""##### 期末项目主要由以下方面组成：""")
        st.write("""&emsp;&emsp;`selenium子项目` + `反爬机制分析` + `request_html爬虫与数据分析子项目`。""")
        st.write("""&emsp;&emsp;**原本的项目设计是打算尝试使用selenium来自动化测试51Job并进行数据的相应爬取，但之后发现即使绕过了登录系统的人机验证，
        要想进入各个岗位的详情页仍然需要通过滑块验证。由此，又要想通过直接获取后台api的形式进行数据获取但仍然行不通（一个月前左右索引页还是能够直接拿到json数据对的，
        但项目正式实施时通过后端方式同样需要经过滑块验证）。故之后根据robots文件，换了高校人才网进行爬取并进行简单数据分析，形成了相应的数据分析报告。**""")
        st.write("""###### &emsp;&emsp;当前网页的展示仅用于数据分析子项目，其他各部分将在期末论文/报告或者演示视频中进行展示。谢谢！""")
    else:
        data = JobData()
        my_figure = None

        st.markdown('金恺文&emsp;计算机科学与技术1班&emsp;200141954')
        st.title('基于高校人才网的学校岗位数据分析')
        st.markdown("### 1. 数据分析项目概述")
        st.write("""&emsp;&emsp;本项目想要通过爬取“高校人才网”所得的相关学校岗位的信息，具体分析如今高校招聘的特点，例如学历要求、人才需求数量与分
        布、教室岗位占比等。所使用的数据集主要来自于**上海，北京，广东，河北，陕西**五个城市中**双一流院校，普通本科院校，高职高专院校，中小学，中专&职业学校&技术学校**五个类型的学校所发布的各类岗位的招聘信息。
        数据集中数据行的数量是能够**继续拓展**的，只需要更改工程文件中**gaoxiaojob.py**即可。但考虑到工作量以及当前数据量已经足以支撑数据分析的现状，故直接针对当前数据集进行分析。""")
        st.write("""&emsp;&emsp;需要注意的是，该数据集中的数据并非表示当前城市所发布的所有岗位信息，且伴有超出上述五类城市范围的**噪声数据**，其主要原因是在爬取数据时并未考虑到网站在进行地区搜索时的特点，例如下方所展示的数据行样例：上海的本地学校，上海杉达学院，在(浙江，嘉兴)进行招聘。但在搜索的过程中是作为关键词为上海的搜索结果。鉴于该
        些数据对分析结果不产生较大的影响，且在数据预处理时较难去除亦或者是归入其应该归入的省市，不进行去除。""")
        is_click = st.button("点击进行数据预加载")
        hint_text = st.text("不进行预加载将无法访问之后数据统计相关内容！")
        if is_click:
            data.load_data()
            my_figure = MyFigure(data)
            hint_text.text("数据预加载成功")
            ab_examples = data.get_abnormal_examples()
            st.table(ab_examples)
        st.write("""&emsp;&emsp;本项目在之后将从以下两个方面进行简单的分析：1. 整体分析，即从整体数据分布上对学校岗位，特别是其中的教师岗位进行分析；
        2. 局部分析，即选取五个城市中的**上海**进行进一步的分析。其中，由于局部特点在很多情况下满足整体特点，故整体分析占大多数。""")

        st.markdown("### 2. 数据集基本情况")
        st.write("""&emsp;&emsp;本数据集总共包含6341条学校内相关岗位的数据，使用`request_html`模块直接请求后台api获得。该数据集是根据实际需求进行定向爬取的：
          上海、北京、广东这三个地区属于国内经济发展的领头羊，河北省具有地方大、人口多的属性，而陕西则位于我国的西北部，与之前的四个城市相比处于偏远状态。
          本数据集中的数据行共拥有14个属性，其中包含岗位名称、学校名称、学校类型、学校所在省份与城市、最低学历要求等。""")
        st.write("""以下使用`head`方法列出了该数据集的前5条数据：""")
        if is_click:
            st.table(data.get_head())
        else:
            st.text("未成功加载数据！请点击最上方按钮！")
        st.write("""以下是列出的数据集相关信息：""")
        if is_click:
            st.image(np.array(Image.open(r"D:\PycharmProjects\51jobProject\Teacher\gui\images\origin_info.png")),
                     caption="原数据集信息概况")
        else:
            st.text("未成功加载数据！请点击最上方按钮！")
        st.write("""&emsp;&emsp;从上方数据概况中可以看到，当前数据集中`jobRecord`项部分为空值，而该属性影响了之后对于岗位学科要求的相关分析，
        故在之后的数据预处理板块中使用“专业不限”进行填充。当然，在第一部分中也提到了，该数据集虽然是在网页上搜索`keyword=['上海','北京','广州','河北','陕西']`所实际返回的结果，
        但其中包含了该些地区的学校或者其分校在其他地区进行招聘的岗位信息，该些信息在本质上应该归属到其相应的地区，但由于没有找到一定的文本分析规则且对整体特征的分析没有造成较大影响，
        故在本项目中不进行额外的修正操作。""")

        st.markdown("### 3. 数据预处理")
        st.markdown("##### 3.1 对`amount`列中的'若干'进行平均值填充")
        st.write("""&emsp;&emsp;通过对数据集中的整体分析，发现`amount`列中存在数值不确定的“若干”项，之后将会妨碍一部分的数据分析，故将该部分数据使用剩余其他`amount`数据总和的均值进行填充。""")
        if is_click:
            st.text("修正之前：")
            st.table(data.get_data().iloc[20: 22])
            st.text("修正之后：")
            st.table(data.fill_amount_average())
        else:
            st.text("未成功加载数据！请点击最上方按钮！")
        st.markdown("##### 3.2 转换object数据类型的数据列")
        st.write("""&emsp;&emsp;在原数据中，系统将`jobName`、`companyName`、`education`等列自动解析为`object`类型，占用内存较多，
        将该些列都转化为`category`类型以节省空间。转换以后的数据集信息如下：""")
        if is_click:
            st.image(np.array(Image.open(r"D:\PycharmProjects\51jobProject\Teacher\gui\images\final_info.png")),
                     caption="转换后的数据集概况")
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("### 4. 数据整体分析")
        st.write("""&emsp;&emsp;在该部分主要从较为整体的角度去分析整个数据集，并将其所得到的分析结果通过数据可视化的方式进行展示并进行归纳与总结，
        其中包括要求学历的统计、地区之间的对比、不同学校类型招聘人员占比之间的对比等。""")
        st.markdown("##### 4.1 主要地区间校内岗位需求量对比")
        if is_click:
            st.pyplot(my_figure.get_bar_on_areas())
            st.write("""&emsp;&emsp;根据上方所得到的图表结果，将从以下两个方面进行分析：""")
            st.write("""&emsp;&emsp;**1.** 从实际地区的人口总数上来看，`截止至2022年下半年，广东省总计拥有11521万人的常住人口数，排名全国第一；而河北总计拥有7420万人常驻人口数，排名全国第六。`
            按照上述人口比例来看，广东省与河北省所需要的学校人才需求应当高于其他三个城市。然而从统计结果来看，**广东省**的各类学校的招聘人数在实际人确实排名第一，符合人口比例规律；然而常住人口较多的**河北省**却拥有
            比人口数更少的**上海**更少的人才需求，违反了人口比例规律。同时，作为西北处的**陕西省**，它也展示出了符合地域分布规律的人才需求规律。""")
            st.write("""&emsp;&emsp;**2.** 从经济发展和教育角度来看，**北上广**的校内人才需求人数应当普遍高于其他地区。固然，上图实际上反映了该类特征。上海和北京两个地区并未受到人口数量的影响，
            反而发布了较多的校内岗位招聘信息；而河北省虽然拥有更多的人口，但由于其经济发展水平和教育水平限制，并没有展现出非常强烈的人才需求欲望。""")
            st.write("""&emsp;&emsp;**总的来说**，要想获得更多的校内岗位的就业机会，判别的依据不能只是该地区的人口数量。人口数量并不是和岗位数或者机会数呈正比关系，
            反而应该以经济发展水平作为主要依据，因而经济发展水平与教育水平往往呈正比关系。""")
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("##### 4.2 发布招聘的学校类型统计")
        if is_click:
            st.write("""&emsp;&emsp;在当前数据集中，`普通本科院校`以及`双一流院校`招聘人数较多，且远超于其他三类学校。这并不代表在实际情况中其余三类的岗位数一定很少，
            不过，以此我们依然可以得出结论：校内岗位在中专、中小学中已经逐渐处于饱和状态，而本科院校仍然需要更多的人才引进以授课、科研或者进行党政工作。""")
            st.pyplot(my_figure.get_bar_on_types())
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("##### 4.3 学校岗位中教师相关岗位占比分析")
        if is_click:
            st.pyplot(my_figure.get_pie_on_teacher())
            st.write("""&emsp;&emsp;根据上方饼图所展示的比例情况，教师岗的招聘信息在所有学校的相关岗位招聘信息中占据约一半以上。也就是说，无论是哪一种类型的教师
            （包括数据集中的`专职教师/教学科研岗`也被算作为教师，但没有包括辅导员岗等辅助性质教师岗位）需求量还是比较大的。我们可以将其看作一种“教师职业市场”
            仍然未达到饱和的信号。当然，我们也应当考虑到，随着学校类型的提升，其对最低学历的要求也会逐步提升。""")
            st.write("""&emsp;&emsp;从下方饼图中可以观察得到，在所有的教师岗位中所要求的最低学历基本上以**硕士研究生**和**博士研究生**为主；有少许本科生，约在**100人中有19人**；
            几乎没有大专生，大概100人中有9人。因此，以一个本科生的视角来看，这样的教师岗位就业形式并**不乐观**。然而，从中小学教师最低学历要求的比例来看，有近**60%**的岗位所需要的最低学历均是本科。
            换句话说，本科生仍然有很大的机会去到各地的中小学担任任课老师，只是要时刻注意比例变化，毕竟学历要求是会随着时间的推移逐渐变高的。""")
            st.pyplot(my_figure.get_pie_on_education())
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("##### 4.4 学校岗位中热门专业分析")
        st.write("""&emsp;&emsp;为了能和上一版块之中统计教师相关岗位占比情况类似，在该节中仍分为整体最热门专业和教师岗位中最热门专业两个部分进行分析，观察并分析哪些专业是在教师岗位
        中最为热门的，为想要成为教师的学生给予一定信息量上的帮助。需要注意的是，该数据集中某些岗位可以招收的专业非常广，例如：上海政法学院的某个专职教师岗
        可以接收`[理论经济学,应用经济学,管理科学与工程,工商管理,农林经济管理,公共管理,图书馆、情报与档案管理]`共8个专业，在统计时并没有将该些专业连成的字符串拆开，而是作为一个类别进行统计，
        故最后的结果均都是以单学科较多的形式进行统计。""")
        if is_click:
            st.markdown("##### 4.4.1 所有学校岗位中热门专业分析")
            st.write("""&emsp;&emsp;从下方的统计表中可以观察到，`教育学`专业在整体学校相关岗位中最为热门，其获得这个排名的原因是比较好分析的：毕竟在学校的工作
            归根结底都是和教育相关的行业的，那么自然而然教育学专业就会比较被各类学校看重；其余可以看到`计算机科学与技术、外国语言文学、体育学`等都是非常热门的专业。
            因此，我们应当意识到，大学生的出路并不一定说走上科研的道路，其实选择教师也是一个很好的选择。例如上述热门专业中属于新理工科类的`计算机科学与技术`，其在理论性和实践性上
            都是很与时代发展的前沿领域搭边的，当然也可以看到在学校中作为校内的工作者同样也很受欢迎。""")
            st.table(data.get_popular_major_all())
            st.markdown("##### 4.4.2 教师岗位中热门专业分析")
            st.table(data.get_popular_major_teacher())
            st.write("""&emsp;&emsp;从上方统计表中可以发现，教师岗位中的热门专业部分与上一部分中所有与学校相关的岗位中的热门专业重合，但在其种类以及排名顺序上并没有完全匹配。例如在所有岗位中
            最受欢迎的`教育学`，在教师岗位中并没有那么受到欢迎，反而是之前排名稍稍落后的`外国语言文学、体育学、计算机科学与技术`有所提升。为了更进一步地了解整体岗位和教师岗位热门专业的重合度，
            以下统计表通过取交集的方式将共有的专业取出，并查看其每个专业的总岗位数与教师岗位数的数量情况。""")
            st.table(data.get_popular_major_merge())
            st.write("""&emsp;&emsp;根据上方统计结果，挑选差值最大的专业`教育学`和最小的专业'体育学'绘制反映占比情况的饼状图，由此可以大胆猜测：总岗位最热门专业并不代表在教师岗位上一定热门。且作为计算机科学与技术专业
            的统计结合也让人大吃一惊：作为科研水平较高的“计科”，其在教师岗位上的需求量也是很大的。结合如今**信息数字化教育政策**的逐步开展，以后该专业所需要的教师或许会更多并内嵌入中小学。由此，
            该专业的学生大可不必认为从事该专业的老师没有前途，在未来的10年甚至5年都有可能突然兴起，变为最受欢迎的教师岗位。""")
            st.pyplot(my_figure.max_min_teacher_difference())
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("##### 4.5 以学校类型统计和分析岗位")
        st.write("""&emsp;&emsp;在之前的几个部分中，从最低学历、最热门专业的教师岗位等方面对于当前教师岗位的需求进行了分析。在接下来的该部分中，
        将以学校类型进行重点分析。由于之前在最低学历分析中已经拿“中小学”进行过分析，故该处主要以`[双一流院校、普通本科院校]`作为主要分析对象。""")
        if is_click:
            st.write("""&emsp;&emsp;下方首先统计了数据集中每一个省市下每个学校类型所提供的岗位数。需要反复说明的是，该统计表中包含了除了5个省市以外
            的噪声数据，该些噪声数据并不会对整体的统计特点产生影响，故并没有去除。此外，其中**高职高专**和**中专技校**等由于脱离了当前分析者所处环境，故不予以更多的分析。""")
            st.table(data.get_group_company())
            st.write("""&emsp;&emsp;基于上述整体描述，接下来重点分析`双一流院校、普通本科院校`中的教师岗位需求。在分析过程中将噪声数据剔除，
            并同时计算双一流院校和普通本科院校之间的差值以反映每个区域的不同。""")
            st.table(data.get_one_and_two())
            st.pyplot(my_figure.one_two_difference())
            st.write("""&emsp;&emsp;根据上述岗位数量差值表，可以看到除了**上海**与**陕西**之外，其余地区双一流院校与普通本科院校所之间招聘的数量差值很大。
            例如在**河北**，双一流院校只提供了**10**个岗位，而普通本科院校提供了**670**个岗位，差距甚大；反观**北京**，双一流院校提供了**668**个岗位，
            而普通本科院校只提供了**63**个岗位，差距反向最大化。""")
            st.write("""&emsp;&emsp;对出现上述数据分布的原因如下：根据现实经济发展情况和教育资源分布情况，北京实际上拥有**27**所双一流院校，
            其中包括`清华大学、北京大学、北京航空航天大学、北京理工大学`等多所全国顶尖的科研院校；与之对应的，上海只拥有**15**所双一流院校，
            河北仅拥有`河北工业大学`**1**所双一流大学。从上述分析中，可以明显感觉到我国的教育资源分布的不平衡，其导致了学校相关岗位的不平衡。
            那么在这些双一流院校和普通本科院校中，有多少是科研岗位，多少是教师岗位呢？接下来将对`上海`地区的情况进行局部分析。""")
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("### 5 数据局部分析")
        st.write("""&emsp;&emsp;在本部分中，将选取数据集中的五个省市中的**上海**进一步分析。""")
        if is_click:
            st.set_option('deprecation.showPyplotGlobalUse', False)
            st.write("""&emsp;&emsp;在下方的图表中可以看到，当前数据集中，上海的**双一流院校**以招聘**科研岗位为主**而**普通本科院校**以**教师岗位为主**。
            这事实上也符合对于双一流院校和普通本科院校的本质不同。当然，在统计该份数据时，特别是针对普通本科院校时，将很多教学与科研的混合岗位算作为教师岗位；
            如果将该岗位分开来统计，那么普通本科院校中的科研岗位和教师岗位差不多。""")
            st.pyplot(my_figure.get_divided_in_shanghai())
            st.write("""&emsp;&emsp;下方想要通过折线图的形式对于招聘的淡季旺季进行统计。故对于该地区进行过去5个月的招聘信息发布情况进行了统计。
            可以简单分析到：大约间隔`2~3`个月就会进入依次发布招聘信息的旺季，该功能能够提醒想要找相关教师岗位工作的学生及时登陆网站进行新信息的查询，以免错过了心仪的岗位。""")
            st.pyplot(my_figure.get_five_month_plot())
        else:
            st.text("未成功加载数据！请点击最上方按钮！")

        st.markdown("### 6 项目总结")
        st.write("""&emsp;&emsp;本项目主要基于`高校人才网`爬取所获得的有关学校岗位的招聘信息，从`校内岗位需求、教师岗位需求、热门专业、招聘信息发布时间`等维度
        简单分析了如今人才市场对教师岗位的要求与需求，从而能够帮助那些想要从事相关工作的同学获得更多的信息。该项目在实施过程中主要从`整体与局部`两个方向开展，
        但鉴于工作量与对项目的整体把握，将分析重点至于整体数据分析。本项目还存在诸多`不足`，诸如显示的界面不够美观、分析不够全面、对于某一地区的特殊性分析较少等问题。若今后
        还有机会对该项目进行优化，将从以上几个方面进行进一步分析，做到能够分析出**更加实用、更加完整**的信息，给想要从事这方面工作的学生以更多的帮助。""")




